package es.ojugames.yincana.creacion;

import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.database.Cursor;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.provider.BaseColumns;
import android.util.Log;
import android.view.Gravity;
import android.view.View;
import android.view.Window;
import android.widget.AdapterView;
import android.widget.EditText;
import android.widget.SimpleCursorAdapter;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;
import es.ojugames.yincana.CheckLocationServiceActivity;
import es.ojugames.yincana.MainActivity;
import es.ojugames.yincana.NoDisponibleActivity;
import es.ojugames.yincana.R;

public class CreatePuntoActivity extends Activity implements Runnable {

	private ProgressDialog pd;
	
	private LocationManager locManager;
	MyLocationListener mLocationListener;
	
	private Spinner tipoPrueba;
	private Long tipoPruebaID;
	private TextView longitudTextView, latitudTextView;
	private Double longitud, latitud;
	
	Location currentLocation = null;
	
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		
		locManager = (LocationManager) getSystemService(LOCATION_SERVICE);
		
		//Cargamos la interfaz
		setContentView(R.layout.create_point_layout);
		
		//Recogemos los elementos que nos hacen falta
		tipoPrueba = (Spinner) this.findViewById(R.id.tipoPruebaSpinner);
		longitudTextView = (TextView) this.findViewById(R.id.longitud);
		latitudTextView = (TextView) this.findViewById(R.id.latitud);
		
		longitud = new Double(0);
		latitud = new Double(0);
		
		//Cargamos los datos para el Spinner de Tipo de pruebas
		String[] camposDbTipoPruebas = { "nombre", BaseColumns._ID  };
		Uri uriTipoPrueba = Uri.parse("content://es.ojugames.yincana/tipopruebas");
		Cursor cursorTipoPruebas = getContentResolver().query(uriTipoPrueba, null, null, null, null);
		int[] camposViewTipoPruebas = new int[] { R.id.nombre };
		SimpleCursorAdapter adapterTipoPruebas = new SimpleCursorAdapter(CreatePuntoActivity.this,
				R.layout.simple_spinner_item, cursorTipoPruebas, camposDbTipoPruebas,
				camposViewTipoPruebas);
		tipoPrueba.setAdapter(adapterTipoPruebas);
		
		//Cuando seleccionamos una opcion recuperamos su id y lo almacenamos
		tipoPrueba.setOnItemSelectedListener(
		        new AdapterView.OnItemSelectedListener() {
		        public void onItemSelected(AdapterView<?> parent,
		            android.view.View v, int position, long id) {
		        	tipoPruebaID = id;
		        }
		 
		        public void onNothingSelected(AdapterView<?> parent) {
		        }
		});
		
	}
	
	@Override
	public void onResume(){
		super.onResume();
		
		if(!locManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
			Intent intent = new Intent(CreatePuntoActivity.this, CheckLocationServiceActivity.class);
	    	startActivity(intent);
		}
	}
	
	public void goToCrearPrueba(View v) {
		if(validarFormulario()) {			
			EditText nombrePuntoForm = (EditText) this.findViewById(R.id.nombrePuntoForm);
			EditText preguntaPuntoForm = (EditText) this.findViewById(R.id.preguntaPuntoForm);
			Spinner tiposDePruebas = (Spinner) this.findViewById(R.id.tipoPruebaSpinner);
			
			//Recogida de datos en un bundle
			Bundle paqueteExtras = new Bundle();
			paqueteExtras.putString("nombrePunto", nombrePuntoForm.getText().toString());
			paqueteExtras.putString("preguntaPunto", preguntaPuntoForm.getText().toString());
			
			//Obtenemos el elemento seleccionado del spinner mediante un cursor
			Cursor cursor = (Cursor)tiposDePruebas.getSelectedItem();
			
			//Creamos el intent en funcion de a qué pantalla de creación de tipo de prueba iremos
			if(cursor.getString(cursor.getColumnIndexOrThrow("nombre")).equalsIgnoreCase("opciones múltiples")){
				Intent intent = new Intent(CreatePuntoActivity.this, CreatePruebaRespuestaMultipleActivity.class);
				intent.putExtras(paqueteExtras);
		    	startActivity(intent);
			}else if(cursor.getString(cursor.getColumnIndexOrThrow("nombre")).equalsIgnoreCase("respuesta sencilla")){
				Intent intent = new Intent(CreatePuntoActivity.this, CreatePruebaRespuestaSencillaActivity.class);
				intent.putExtras(paqueteExtras);
				startActivity(intent);
			}else{
				Intent intent = new Intent(CreatePuntoActivity.this, NoDisponibleActivity.class);
				startActivity(intent);
			}
		}
		else {
			//Aviso de que hay que rellenar todos los campos
			Toast toast = Toast.makeText(CreatePuntoActivity.this, R.string.formularioBlanco, Toast.LENGTH_LONG);
			toast.setGravity(Gravity.CENTER, 0, 0);
			toast.show();
		}
	}
	
	public boolean validarFormulario() {
		String nombreText = ((EditText) this.findViewById(R.id.nombrePuntoForm)).getText().toString();
		String preguntaText = ((EditText) this.findViewById(R.id.preguntaPuntoForm)).getText().toString();
		
		return (!nombreText.equals("")) && (!preguntaText.equals("")) && (longitud!=null) && (latitud!=null)
			&& (longitud.doubleValue()!=0) && (latitud.doubleValue()!=0);
	}
	
	public void fijarUbicacion(Location loc) {
		if(loc != null) {
			longitud = new Double(loc.getLongitude() * 1E6);
			latitud = new Double(loc.getLatitude() * 1E6);
			latitudTextView.setText("Latitud: " + latitud.toString());
	        longitudTextView.setText("Longitud: " + longitud.toString());
	    }
	    else {
	    	longitudTextView.setText("sin_datos");
	    	latitudTextView.setText("sin_datos");
	    }
	}
	
	public void obtenerUbicacion(View v) {
		DialogInterface.OnCancelListener dialogCancel = new DialogInterface.OnCancelListener() {

            public void onCancel(DialogInterface dialog) {
                Toast.makeText(getBaseContext(), 
                        getResources().getString(R.string.gps_signal_not_found), 
                        Toast.LENGTH_LONG).show();
                handler.sendEmptyMessage(0);
            }
          
        };
    	
		pd = ProgressDialog.show(this, this.getResources().getString(R.string.search), 
				this.getResources().getString(R.string.search_signal_gps), true, true, dialogCancel);
		
		Thread thread = new Thread(this);
		thread.start();
	}
	
	public void seleccionarUbicacion(View v) {
		Intent intent = new Intent(CreatePuntoActivity.this, SeleccionarUbicacionActivity.class);
		startActivityForResult(intent, 1);
	}
	
	@Override 
	public void onActivityResult(int requestCode, int resultCode, Intent data) {     
	  super.onActivityResult(requestCode, resultCode, data); 
	  switch(requestCode) { 
	    case (1) : { 
	      if (resultCode == Activity.RESULT_OK) { 
	    	  	longitud = data.getDoubleExtra("ln", new Double(0));
				latitud = data.getDoubleExtra("lt", new Double(0));
				latitudTextView.setText("Latitud: " + latitud.toString());
		        longitudTextView.setText("Longitud: " + longitud.toString());
              }
              break; 
	     } 
	   } 
    }

	public void run() {
		//locManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
		
		if (locManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
			
			Looper.prepare();
			
			mLocationListener = new MyLocationListener();
			
			locManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, mLocationListener);
			Looper.loop(); 
			Looper.myLooper().quit(); 
			
		} else {
			Intent intent = new Intent(CreatePuntoActivity.this, CheckLocationServiceActivity.class);
	    	startActivity(intent);
        }
	}
	
	private Handler handler = new Handler() {
		@Override
		public void handleMessage(Message msg) {
			pd.dismiss();
			locManager.removeUpdates(mLocationListener);
	    	if (currentLocation != null) {
	    		fijarUbicacion(currentLocation);
	    	}
		}
	};
	
	private class MyLocationListener implements LocationListener {
        public void onLocationChanged(Location loc) {
            if (loc != null) {
//                Toast.makeText(getBaseContext(), 
//                    getResources().getString(R.string.gps_signal_found), 
//                    Toast.LENGTH_LONG).show();
               currentLocation = loc;
               handler.sendEmptyMessage(0);
            }
        }

		public void onProviderDisabled(String provider) {
			// TODO Auto-generated method stub
			
		}

		public void onProviderEnabled(String provider) {
			// TODO Auto-generated method stub
			
		}

		public void onStatusChanged(String provider, int status, Bundle extras) {
			// TODO Auto-generated method stub
			
		}

       
    } 
}
